/*
 			$.kefu({
					host:"127.0.0.1",
					ws_url:"",
					static_path:"http://127.0.0.1:8080/Jstx/",
					local_cookies:true,
					user_img:'./lib/imgs/def_user_img.png'
				}); 
  
 * */
jQuery.kefu=function(conf){
	var log=function(inf){
		console.log(inf);
	}
	var guid=function() {
		  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
		    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
		    return v.toString(16);
		  });
	}
	log("Info:kefu service starting.");

	var host="127.0.0.1";
	var user_img="./lib/imgs/def_user_img.png";
	var system_img="./lib/imgs/luntan_logo.png";
	var greetings="您好,请问您有什么问题吗？";//问候语
	var user_id;
	var user_name="访客";
	var user_mine={};
	var system_mine={};
	var ws_url;
	var ws;
	var static_path="http://127.0.0.1:8080/Jstx/";
	var no_sys_open_robot=false;
	log("Info:read confing.");
	if(conf==undefined){
		conf={
				host:"127.0.0.1",
				ws_url:"ws://127.0.0.1:8080/Jstx/client.c",
				static_path:"http://127.0.0.1:8080/Jstx/",
				local_cookies:true,
				no_sys_open_robot:false
		};
		log("Error:incomplete config");
		return false;
	}
	if(conf.host!=undefined){
		host=conf.host;
	}
	if(conf.user_img!=undefined){
		user_img=conf.user_img;
	}
	if(conf.greetings!=undefined){
		//load conf's def greetings. next if connectioned server,load server's greetings,if server have,next this greetings = server's.
		greetings=conf.greetings;
	}
	if(conf.user_name!=undefined){
		user_name=conf.user_name;
	}
	if(conf.static_path!=undefined){
		static_path=conf.static_path;
	}
	if(conf.ws_url==undefined){
		log("Error:incomplete config,ws_url is undefined.");
		return false;
	}else{
		ws_url=conf.ws_url;
	}
	if(conf.no_sys_open_robot!=undefined){
		no_sys_open_robot=conf.no_sys_open_robot;
	}
	if(conf.system_img!=undefined){
		system_img=conf.system_img;
	}
	log("Info:find user id or create new user id");
	if($.cookie!=undefined){
		log("Info:load local cache user id");
		user_id=$.cookie('kefu_user_id');
	}
	if($.cookie==undefined||user_id==undefined||user_id==null){
		log("Info:local don't have user id,generate a user id");
		user_id=guid();
	}else{
		log("Info:check the user id");
	}
	if(conf.local_cookies!=undefined&&!conf.local_cookies){
		log("Info:don't save user id in local.");
		if($.cookie!=undefined){
			$.cookie('kefu_user_id',null);//delete user id from local cookie.
		}
	}else{
		log("Info:save or update user id in local cookie.");
		if($.cookie!=undefined){
			$.cookie('kefu_user_id',user_id);//save user id to local cookie.
		}
	}
		log("Info:load layui.");
	try {
		layui.use(['layim', 'layer'], function(layim,layer){
			log("Info:create layim tools.");
			layim.on('tool(a)', function(insert, send, obj){ //事件中的tool为固定字符，而code则为过滤器，对应的是工具别名（alias）
				  layer.prompt({
				    title: '插入链接'
				    ,formType: 2
				    ,shade: 0
				  }, function(text, index){
				    layer.close(index);
				    insert('a('+text+')[链接:【'+text+'】]'); //将内容插入到编辑器，由insert完成
				    send(); //自动发送
				  });
			});
			layim.on('sendMessage', function(res){
				  var mine = res.mine; //包含我发送的消息及我的信息
				  var to = res.to; //对方的信息
				  if(ws==undefined||ws.readyState!=1){
					  layim.getMessage({
						  system: true //系统消息
						  ,id: 1 //聊天窗口ID
						  ,type: "kefu" //聊天窗口类型
						  ,content: '未获取到客服信息,请<a href="javascript:void(0)">重试</a>'
						});
				  }else{
					//处理发送的消息
						ws.send(JSON.stringify({
							method: 'send_info', //随便定义，用于在服务端区分消息类型
							params:{
						    	form:mine,
						    	to:to,
						    	content:mine.content
						    }
						}));
				  }
			});
			log("Info:load Event funciton.");
			/*
			 * 连接失败/没有客服在线处理方法
			 * code : 0-连接失败,1-没有客服在线
			 * */
			var no_conn=function(code){
				switch(code){
					case 0:
						log("Error:web socket connection is error.");
						break;
					case 1:
						log("Error:now don't have online system.");
						break;
				}
				if(code==1&&no_sys_open_robot){
					//当没有客服在线时,后续可以修改成 机器人回复。(未实现)
				}else{
					//打开窗体,并提醒用户没有在线客服。
					system_mine={
						    name: "客服暂时不在,晚一会儿再联系他吧。"
							    ,type: 'kefu'
							    ,avatar: system_img
							    ,id: 1
							};
					layim.chat(system_mine);
					layim.setFriendStatus(1, 'offline');//置灰
					ws.close();//关闭socket连接
				}
			};
			
			/*
			 * 给用户发送问候语
			 * 连接后执行,连接成功时,另附获取服务器问候语。
			 * 
			 * */
			/*
			 * 客服
			 * 
			 * */
			/*
			 * 用户下线事件
			 * 1.用户关闭窗口执行 2.浏览器退出执行
			 * 
			 * */
			log("Info:create user mine.");
			//创建用户消息体
			user_mine={
			        "username": user_name //我的昵称
			        ,"id": user_id //我的ID
			        ,"status": "online" //在线状态 online：在线、hide：隐身, 默认在线,如果用户退出,再发送下线命令
			        ,"avatar": user_img//用户头像头像
			        ,"type":"user"
			};
			log("Info:config layim.");
			//初始化客服信息配置
			layim.config({
			    //配置客户信息
			    init: {
			      //配置客户信息
			      mine:user_mine
			    }
			    //上传图片接口
			    ,uploadImage: {
			      url: static_path+'upload/img.c' //（返回的数据格式见下文）
			      ,type: 'post' //默认post
			    }
			    //上传文件接口
			    ,uploadFile: {
			      url: static_path+'/upload/file.c' //（返回的数据格式见下文）
			      ,type: 'post' //默认post
			    }
			    //扩展工具栏
			    ,tool: [
			    	{
				    	alias: 'a' //工具别名
					    ,title: '链接' //工具名称
					    ,icon: '&#xe64d;' //工具图标，参考图标文档
				  	}
			    ]
			    ,voice:false
			    ,brief: true //是否简约模式(客服模式)
			    ,notice: true //是否开启桌面消息提醒，默认false
			   //,chatLog: lt_logs
			  });
			log("Info:try create connection to server.");
			try{
				if(ws!=null){
					ws.close();
					ws=undefined;
				}
				ws=new WebSocket(ws_url);
				log("Info:A connection with a server has been established.");
				//获取在线客服
				/*
				 * 用户上线事件
				 * 连接创建后执行
				 * */
				ws.onopen=function(e){
					/*
					 * 向layim窗口输出 连接客服服务器信息
					 * 窗体创建后执行 
					 */
					//发送用户上线命令
					ws.send(JSON.stringify({
						method: 'user_online' //随便定义，用于在服务端区分消息类型
					    ,params:{
					    	form:user_mine
					    }
					}));
					
				};
				ws.onclose=function(e){
					
					layim.getMessage({
						  system: true //系统消息
						  ,id: 1 //聊天窗口ID
						  ,type: "kefu" //聊天窗口类型
						  ,content: '已断开与客服人员连接'
						});
				};
				ws.onerror=function(e){
					layer.msg('与服务器连接出现异常,请刷新页面重试。');
					console.log(e);//打印异常
				}
				ws.onmessage=function(message){
					
					console.log("Info:接收到服务器响应。");
					var result=JSON.parse(message.data);
					switch (result.method) {
					case "kefu_shangxian":
						layim.setFriendStatus(result.form.id, 'online');
						layim.getMessage({
							  system: true //系统消息
							  ,id: 1 //聊天窗口ID
							  ,type: "kefu" //聊天窗口类型
							  ,content: result.form.username+'上线了。'
							});
						break;
					case "kefu_xiaxian":
						layim.setFriendStatus(result.form.id, 'offline');
						layim.getMessage({
							  system: true //系统消息
							  ,id: 1 //聊天窗口ID
							  ,type: "kefu" //聊天窗口类型
							  ,content: result.form.username+' 下线或离开,<a class="" style="color:#01AAED;">选择</a> 其他客服咨询。 '
						});
						break;
					case "null_system":
						no_conn(1);
						break;
					case "join_chat":
						system_mine=JSON.parse(result.toJson);
						console.log("join_chat");
						//加入聊天
						layim.chat({
							  id: system_mine.id
							  ,name: system_mine.username //名称
							  ,type: 'kefu' //聊天类型
							  ,avatar: system_mine.avatar //头像
						});
					    layim.getMessage({
					        system: true //系统消息
					        ,id: system_mine.id //聊天窗口ID
					        ,type: "kefu" //聊天窗口类型
					        ,content: '已为您分配客服人员'
					     });
						break;
					case "get_message":
						//输出信息
						layim.getMessage({
					        username: result.form.username //消息来源用户名
					        ,avatar: result.form.avatar //消息来源用户头像
					        ,id: result.form.id //消息的来源ID（如果是私聊，则是用户id，如果是群聊，则是群组id）
					        ,sign:result.form.sign
					        ,type: "kefu" //聊天窗口来源类型，从发送消息传递的to里面获取
					        ,content: result.content//消息内容
					        ,mine: false //是否我发送的消息，如果为true，则会显示在右方
					        ,fromid: 1 //消息的发送者id（比如群组中的某个消息发送者），可用于自动解决浏览器多窗口时的一些问题
					        ,timestamp: new Date() //服务端时间戳毫秒数。注意：如果你返回的是标准的 unix 时间戳，记得要 *1000
					    });
						break;
					default:
						alert("default");
						break;
					}
				};
			}catch(e){
				//抛出连接异常事件,打开窗体,更改在线状态以及客服信息
				no_conn(0);
			}
			log("Info:open layim.");
		});
	} catch (e) {
		log("Error:load layim is error.");
	}
	log("Info:create connection to server.");
	
};